#ifndef _SERIAL_PORT_H_
#define _SERIAL_PORT_H_

#include <string>
#include <vector>

enum class DataBits { FIVE, SIX, SEVEN, EIGHT };   // 数据位 5 6 7 8
enum class StopBits { ONE, ONE_POINT_FIVE, TWO };  // 停止位 1 1.5 2
enum class Parity { NONE, EVEN, ODD };  // 校验规则  无校验 偶校验 奇校验
enum class FlowControl {
  NONE,
  HARDWARE,
  SOFTWARE
};  // 流控制  无控制（不需要速率同步） 硬件流 软件流

// 用来保存硬件配置
struct SerialConfig {
  int baut_rate = 9600;  // 波特率，默认为9600
  DataBits data_bits = DataBits::EIGHT;
  StopBits stop_bits = StopBits::ONE;
  Parity parity = Parity::NONE;
  FlowControl flow_control = FlowControl::NONE;
};
class SerialPort {
 public:
  SerialPort(const std::string& port_name, const SerialConfig& config);
  ~SerialPort();
  bool OpenSerialPort();  // 默认配置打开串口
  bool OpenSerialPort(const SerialConfig& config);

  ssize_t Write(const uint8_t* data, size_t length);  // 发送数据
  ssize_t Read(uint8_t* buffer, size_t max_length);   // 接收数据
  bool IsOpen();                                      // 串口是否打开

  bool ChangeSerialPortConfig(const SerialConfig& config);  // 更改串口配置
  SerialConfig GetSerialPortConfig();                       // 获取串口配置

 private:
  bool ConfigureAllSettings(struct termios* tty);        // 设置所有配置
  bool SetBautRate(int bautrate);                        // 设置波特率
  bool UpdateConfiGuration();                            // 更新配置

  std::string port_name_;       // 串口名
  int port_fd_ = -1;            // 串口文件描述符
  bool is_open_;                // 串口开关状态
  SerialConfig serial_config_;  // 串口配置
};
#endif